package desmontec.documentos

import java.util.List

import desmontec.funcionarios.Engenheiro
import desmontec.util.*
import desmontec.validacoes.guia.ValidarQuantidadesDaGuia

class MapaEstocagemController {


	DpgService dpgService
	GuiaDeTrafegoService guiaDeTrafegoService
	static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	MapaEstocagemService mapaEstocagemService

	def index = {
		redirect(action: "list", params: params)
	}

	def list = {

		session.removeAttribute "idMapaEstocagem"

		params.max = Math.min(params.max ? params.int('max') : 10, 100)
		def mapaDoUsuario = mapaEstocagemService.mapasDoUsuario()
		[mapaEstocagemInstanceList: mapaDoUsuario, mapaEstocagemInstanceTotal:mapaDoUsuario.size]
		//		[mapaEstocagemInstanceList: MapaEstocagem.list(params), mapaEstocagemInstanceTotal: MapaEstocagem.count()]
	}

	// FLUXO PARA CRIAR UM MAPA DE ESTOCAGEM - INICIO
	def criarDPGdoMapa = {
		// remove qualquer atributo que tenha ficado na sess�o
		session.removeAttribute "mapaEstocagem"
		session.removeAttribute "idDPG"
		session.removeAttribute "listaGuiasDeTrafego"

		session.setAttribute "flagExibir", Constantes.TODAS_AS_DPGS_VALIDAS
		def listaDPGs;
		if (session.getAttribute("flagExibir") == Constantes.TODAS_AS_DPGS) {
			listaDPGs = dpgService.consultarDPGs()
		} else {
			listaDPGs = dpgService.consultarDPGsValidas()
		}

		def mapaEstocagemInstance = new MapaEstocagem()
		return [listaDPGs: listaDPGs, mapaEstocagemInstance: mapaEstocagemInstance]
	}

	def criarDPGInv = {
		session.setAttribute "flagExibir", Constantes.TODAS_AS_DPGS
		def listaDPGs  = dpgService.consultarDPGs()
		def mapaEstocagemInstance = new MapaEstocagem()
		render(view:"criarDPGdoMapa", model: [mapaEstocagemInstance: mapaEstocagemInstance, listaDPGs: listaDPGs])
	}

	def salvarDPGdoMapa = {
		def idParam = params.idDPG;

		// nao foi selecionado nenhum ID, exibir mensagem de erro nullable para DPG do ME
		if (idParam == null){
			def mapaEstocagemInstance = new MapaEstocagem()
			mapaEstocagemInstance.errors.reject 'Por favor selecione uma DPG'

			def listaDPGs;
			if (session.getAttribute("flagExibir") == Constantes.TODAS_AS_DPGS){
				listaDPGs = dpgService.consultarDPGs()
			}
			else {
				listaDPGs = dpgService.consultarDPGsValidas()
			}
			render(view:"criarDPGdoMapa", model: [mapaEstocagemInstance: mapaEstocagemInstance,
						listaDPGs: listaDPGs])
			return
		} else {
			def idSelecionado = new Integer(idParam);
			session.setAttribute "idDPG", idSelecionado
			redirect(action: "criarMapaEstocagem")
			return
		}
	}

	def criarMapaEstocagem = {
		def mapaEstocagemInstance = new MapaEstocagem()
		mapaEstocagemInstance.competencia = params.competencia
		Integer idDPG = (Integer) session.getAttribute("idDPG");
		def dpgInstance = DPG.get(idDPG)
		return [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance: dpgInstance]
	}

	def voltarParaSelecionarDPG = {
		redirect(action:"criarDPGdoMapa")
		return
	}

	def salvarMapaEstocagem = {

		def mapaEstocagemInstance = new MapaEstocagem();
		mapaEstocagemInstance.properties = params
		
		//fernando.alves - inicio
		mapaEstocagemInstance.competencia = params.competencia
		//fernando.alves - fim
		
		Integer idDPG = (Integer) session.getAttribute("idDPG");
		def dpgInstance  = DPG.get(idDPG)

		mapaEstocagemInstance.dpg = dpgInstance

		if(!mapaEstocagemInstance.validate()){
			render(view:"criarMapaEstocagem", model: [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance: dpgInstance])
			return
		} else {
			session.setAttribute "mapaEstocagem", mapaEstocagemInstance
			redirect(action:"adicionarGuias")
			return
		}
	}

	def voltarParaCriarMapa = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagem");
		def dpgInstance  = DPG.get(mapaEstocagemInstance.dpg.id)
		session.removeAttribute "listaGuiasDeTrafego"
		render(view:"criarMapaEstocagem", model: [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance: dpgInstance])
		return
	}

	def adicionarGuias = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagem");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)

		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");
		if(listaGuiasDeTrafego == null){
			listaGuiasDeTrafego = new ArrayList<GuiaDeTrafego>();
		}
		session.setAttribute "listaGuiasDeTrafego", listaGuiasDeTrafego

		return [mapaEstocagemInstance: mapaEstocagemInstance,
			dpgInstance: dpgInstance,
			listaGuiasDeTrafego:listaGuiasDeTrafego]
	}

	def voltarParaAdicionarGuias = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagem");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");

		render (view:"adicionarGuias", model:[mapaEstocagemInstance: mapaEstocagemInstance,
					dpgInstance: dpgInstance, listaGuiasDeTrafego:listaGuiasDeTrafego])
		return
	}

	def adicionarNovaGuia = {
		def guiaDeTrafegoInstance = new GuiaDeTrafego()
		guiaDeTrafegoInstance.properties = params
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance]
	}

	def validarGuia = {

		//fernando.alves - inicio

		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagem");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)

		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");
		def guiaDeTrafegoInstance = new GuiaDeTrafego(params)
		guiaDeTrafegoInstance.mapaDeEstocagem = mapaEstocagemInstance
		// evita que parametros incorretos quebrem a validacao
		if (!guiaDeTrafegoInstance.validate()){
			return [resposta: Constantes.GUIA_RESPOSTA_SUCESSO]
		}

		if(!guiaDeTrafegoService.validarMateriaisDaGuia2(guiaDeTrafegoInstance, listaGuiasDeTrafego, dpgInstance)){
			return [resposta: Constantes.GUIA_RESPOSTA_ERRO]
		}
		return [resposta: Constantes.GUIA_RESPOSTA_SUCESSO]

		//fernando.alves - fim
	}

	def salvarNovaGuia = {
		def guiaDeTrafegoInstance = new GuiaDeTrafego()
		guiaDeTrafegoInstance.properties = params
		guiaDeTrafegoInstance.mapaDeEstocagem = new MapaEstocagem()

		if(!guiaDeTrafegoInstance.validate()){
			render(view:"adicionarNovaGuia", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance])
			return
		} else {
			List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");
			if (listaGuiasDeTrafego == null) {
				listaGuiasDeTrafego = new ArrayList<GuiaDeTrafego>();
			}
			// valida se existe alguma guia com mesmo numero
			for(GuiaDeTrafego guiaAtual: listaGuiasDeTrafego){
				if(guiaAtual.numeroDaGuia.equals(guiaDeTrafegoInstance.numeroDaGuia)){
					guiaDeTrafegoInstance.errors.reject "Numero da guia deve j� existente"
					render(view:"adicionarNovaGuia", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance])
					return
				}
			}

			listaGuiasDeTrafego.add(guiaDeTrafegoInstance);
			session.setAttribute "listaGuiasDeTrafego", listaGuiasDeTrafego
			flash.message = flash.message = "${message(code: 'desmontec.documentos.guiadetrafego.default.created.message')}"
			redirect(action:"adicionarGuias")
			return
		}
	}

	def concluirMapaEstocagem = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagem");
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");

		if (mapaEstocagemInstance.save(flush: true)) {

			for(GuiaDeTrafego guiaAtual: listaGuiasDeTrafego){
				guiaAtual.mapaDeEstocagem = mapaEstocagemInstance;
				guiaAtual.save(flush: true);
			}
			//fernando.alves - inicio
			//depois de adicionar as guias, verificamaos a validade da dpg
			def resposta = 0
			resposta = dpgService.atualizaValidadeDPG(mapaEstocagemInstance.dpg)
			StringBuffer mensagem = new StringBuffer();

			if (resposta == Constantes.DPG_INVALIDADA){
				mensagem.append ("DPG numero ");
				mensagem.append(mapaEstocagemInstance.dpg.numero);
				mensagem.append(" invalidada.");
				mensagem.append(Constantes.LINHA);
				mensagem.append("${message(code: 'desmontec.documentos.MapaEstocagem.default.created.message')}");

				flash.message = mensagem.toString();
			} else {
				flash.message = "${message(code: 'desmontec.documentos.MapaEstocagem.default.created.message')}"
			}


			//fernando.alves - fim
			session.removeAttribute "mapaEstocagem"
			session.removeAttribute "idDPG"
			session.removeAttribute "listaGuiasDeTrafego"
			session.removeAttribute "flagExibir"

			redirect (action:"exibirMapaEstocagem", id: mapaEstocagemInstance.id)
			return
		}
		return
	}

	def exibirGuia = {
		def guiaDeTrafegoInstance = GuiaDeTrafego.get(params.id)
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance]
	}

	def exibirGuiaAdicionada = {
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");
		def guiaDeTrafegoInstance = listaGuiasDeTrafego.get(Integer.parseInt(params.id))
		System.out.println(guiaDeTrafegoInstance);
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance]
	}

	def excluirGuia = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagem");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");

		listaGuiasDeTrafego.remove(Integer.parseInt(params.id));
		session.setAttribute "listaGuiasDeTrafego", listaGuiasDeTrafego

		flash.message = flash.message = "${message(code: 'desmontec.documentos.guiadetrafego.default.deleted.message')}"

		render(view:"adicionarGuias", model:[mapaEstocagemInstance: mapaEstocagemInstance,
					dpgInstance: dpgInstance, listaGuiasDeTrafego:listaGuiasDeTrafego])
		return
	}

	def editarNovaGuia = {
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");
		def guiaDeTrafegoInstance = listaGuiasDeTrafego.get(Integer.parseInt(params.id));
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance, indexGuia: params.id]
	}

	def salvarEditarNovaGuia = {
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafego");
		System.out.println(params.indexGuia);
		def guiaDeTrafegoInstance = listaGuiasDeTrafego.get(Integer.parseInt(params.indexGuia));
		guiaDeTrafegoInstance.properties = params
		guiaDeTrafegoInstance.mapaDeEstocagem = new MapaEstocagem()

		if(!guiaDeTrafegoInstance.validate()){
			render(view:"editarNovaGuia", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance, indexGuia: params.id])
			return
		} else {
			if (listaGuiasDeTrafego == null) {
				listaGuiasDeTrafego = new ArrayList<GuiaDeTrafego>();
			}
			// valida se existe alguma guia com mesmo numero
			int i = 0;
			for(GuiaDeTrafego guiaAtual: listaGuiasDeTrafego){
				if(guiaAtual.numeroDaGuia.equals(guiaDeTrafegoInstance.numeroDaGuia) && (i != Integer.parseInt(params.indexGuia))){
					guiaDeTrafegoInstance.errors.reject "Numero da guia deve ja existente"
					render(view:"editarNovaGuia", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance])
					return
				}
				i ++;
			}

			listaGuiasDeTrafego.remove(Integer.parseInt(params.indexGuia));
			listaGuiasDeTrafego.add(Integer.parseInt(params.indexGuia), guiaDeTrafegoInstance);
			session.setAttribute "listaGuiasDeTrafego", listaGuiasDeTrafego
			flash.message = flash.message = "${message(code: 'desmontec.documentos.guiadetrafego.default.updated.message')}"
			redirect(action:"adicionarGuias")
			return
		}
	}
	// FLUXO PARA CRIAR UM MAPA DE ESTOCAGEM - FIM

	def edit = {
		def mapaEstocagemInstance = MapaEstocagem.get(params.id)
		if (!mapaEstocagemInstance) {
			flash.message = "${message(code: 'desmontec.documentos.MapaEstocagem.default.updated.message')}"
			redirect(action: "list")
		}
		else {
			return [mapaEstocagemInstance: mapaEstocagemInstance]
		}
	}

	def update = {
		def mapaEstocagemInstance = MapaEstocagem.get(params.id)
		if (mapaEstocagemInstance) {
			if (params.version) {
				def version = params.version.toLong()
				if (mapaEstocagemInstance.version > version) {

					mapaEstocagemInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [
						message(code: 'mapaEstocagem.label', default: 'MapaEstocagem')]
					as Object[], "Another user has updated this MapaEstocagem while you were editing")
					render(view: "edit", model: [mapaEstocagemInstance: mapaEstocagemInstance])
					return
				}
			}
			mapaEstocagemInstance.properties = params
			if (!mapaEstocagemInstance.hasErrors() && mapaEstocagemInstance.save(flush: true)) {
				"${message(code: 'desmontec.documentos.MapaEstocagem.default.updated.message')}"
				redirect(action: "show", id: mapaEstocagemInstance.id)
			}
			else {
				render(view: "edit", model: [mapaEstocagemInstance: mapaEstocagemInstance])
			}
		}
		else {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'mapaEstocagem.label', default: 'MapaEstocagem'), params.id])}"
			redirect(action: "list")
		}
	}
	// FLUXO DE TELAS PARA EDICAO DE MAPAS DE ESTOCAGEM


	// FLUXO DE EDITAR GUIA - INICIO
	def editarGuiaId = {
		def guiaDeTrafegoInstance = GuiaDeTrafego.get(Integer.parseInt(params.id));

		if (!guiaDeTrafegoInstance) {
			flash.message = "Nao foi poss�vel recuperar a guia de trafego"
			redirect(action: "list")
			return
		}
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance]
	}

	def validarGuiaId = {
		def guiaDeTrafegoInstance = GuiaDeTrafego.get(params.idGuia);

		ValidarQuantidadesDaGuia validarQuantidadesDaGuia = new ValidarQuantidadesDaGuia();
		if(!guiaDeTrafegoInstance){
			return [resposta: Constantes.GUIA_RESPOSTA_ERRO]
		} else {
			bindData(validarQuantidadesDaGuia, params)
		}

		// guia falsa para valida��o de parametros
		def guiaFalsa = new GuiaDeTrafego(params
				)
		guiaFalsa.id = guiaDeTrafegoInstance.id
		guiaFalsa.mapaDeEstocagem = guiaDeTrafegoInstance.mapaDeEstocagem

		if(!guiaFalsa.validate()){
			return [resposta: Constantes.GUIA_RESPOSTA_SUCESSO]
		}

		if(!guiaDeTrafegoService.validarMateriaisDaGuia(validarQuantidadesDaGuia, guiaDeTrafegoInstance)){
			return [resposta: Constantes.GUIA_RESPOSTA_ERRO]
		}
		return [resposta: Constantes.GUIA_RESPOSTA_SUCESSO]
	}

	def salvarEditarGuiaId = {
		def guiaDeTrafegoInstance = GuiaDeTrafego.get(params.idGuia);
		guiaDeTrafegoInstance.properties = params

		if(!guiaDeTrafegoInstance.validate()){
			render(view: "editarGuiaId", model: [guiaDeTrafegoInstance:guiaDeTrafegoInstance])
			return
		} else {

			try {
				guiaDeTrafegoInstance.save(flush: true)
				def dpg = guiaDeTrafegoInstance.mapaDeEstocagem.dpg
				// revalidar DPG - INICIO
				def resposta = 0
				def mensagem = new StringBuffer();
				resposta = dpgService.atualizaValidadeDPG(dpg)
				if (resposta == Constantes.DPG_INVALIDADA){
					mensagem.append ("DPG numero ");
					mensagem.append(dpg.numero);
					mensagem.append(" invalidada.");
					mensagem.append(Constantes.LINHA);
				}
				// revalidar DPG - FIM
				mensagem.append("${message(code: 'desmontec.documentos.guiadetrafego.default.updated.message')}");
				flash.message = mensagem.toString();
				redirect(action:"exibirMapaEstocagem", id: guiaDeTrafegoInstance.mapaDeEstocagem.id)
				return

			}catch (org.springframework.dao.DataIntegrityViolationException e) {
				flash.message = "Nao foi possivel atualizar a guia de trafego"
				render(view: "editarGuiaId", model: [guiaDeTrafegoInstance:guiaDeTrafegoInstance])
				return
			}
		}
	}

	def removerGuiaId = {
		def guiaDeTrafegoInstance = GuiaDeTrafego.get(Integer.parseInt(params.id));
		if(!guiaDeTrafegoInstance){
			flash.message = "Nao foi possivel atualizar a guia de trafego"
			redirect(action:"exibirMapaEstocagem", id: guiaDeTrafegoInstance.mapaDeEstocagem.id)
			return
		}

		def listaGuias = GuiaDeTrafego.findAllByMapaDeEstocagem(guiaDeTrafegoInstance.mapaDeEstocagem)
		if (listaGuias != null && listaGuias.size() == 1){
			flash.message = "Um mapa de estocagem deve ter no minimo uma guia de trafego"
			redirect(action:"exibirMapaEstocagem", id: guiaDeTrafegoInstance.mapaDeEstocagem.id)
			return
		}
		try {
			def idMapa = guiaDeTrafegoInstance.mapaDeEstocagem.id
			def dpg = guiaDeTrafegoInstance.mapaDeEstocagem.dpg
			guiaDeTrafegoInstance.delete(flush: true)
			// revalidar DPG - INICIO
			def resposta = 0
			def mensagem = new StringBuffer();
			resposta = dpgService.atualizaValidadeDPG(dpg)
			if (resposta == Constantes.DPG_INVALIDADA){
				mensagem.append ("DPG numero ");
				mensagem.append(dpg.numero);
				mensagem.append(" invalidada.");
				mensagem.append(Constantes.LINHA);
			}
			// revalidar DPG - FIM
			mensagem.append("${message(code: 'desmontec.documentos.guiadetrafego.default.deleted.message')}");
			flash.message = mensagem.toString();
			redirect(action:"exibirMapaEstocagem", id: idMapa)
			return

		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			flash.message = "Nao foi possivel remover a guia de trafego"
			redirect(action:"exibirMapaEstocagem", id: guiaDeTrafegoInstance.mapaDeEstocagem.id)
			return
		}
	}
	// FLUXO DE EDITAR GUIA - FIM

	def exibirMapaEstocagem = {
		def mapaEstocagemInstance = MapaEstocagem.get(params.id)
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)
		def listaGuiasDeTrafego = GuiaDeTrafego.findAllByMapaDeEstocagem(mapaEstocagemInstance)

		if (!mapaEstocagemInstance) {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'mapaEstocagem.label', default: 'MapaEstocagem'), params.id])}"
			redirect(action: "list")
			return
		}
		else {
			return [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance:dpgInstance, listaGuiasDeTrafego:listaGuiasDeTrafego]
		}
	}

	def delete = {
		def mapaEstocagemInstance = MapaEstocagem.get(params.id)
		if (mapaEstocagemInstance) {
			try {
				mapaEstocagemInstance.delete(flush: true)
				//fernando.alves - inicio
				//depois de excluir o mapa e consequentemente as guias, verificamos a validade da dpg
				dpgService.atualizaValidadeDPG(mapaEstocagemInstance.dpg)
				//fernando.alves - fim

				flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'mapaEstocagem.label', default: 'MapaEstocagem'), params.id])}"
				redirect(action: "list")
			}
			catch (org.springframework.dao.DataIntegrityViolationException e) {
				flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'mapaEstocagem.label', default: 'MapaEstocagem'), params.id])}"
				redirect(action: "show", id: params.id)
			}
		}
		else {
			flash.message = "${message(code: 'desmontec.documentos.MapaEstocagem.default.deleted.message')}"
			redirect(action: "list")
		}
	}




	// FLUXO PARA EDITAR UM MAPA DE ESTOCAGEM - INICIO
	def criarDPGdoMapaEditar = {
		// remove qualquer atributo que tenha ficado na sess�o
		session.removeAttribute "mapaEstocagemEditar"
		session.removeAttribute "idDPGEditar"
		session.removeAttribute "listaGuiasDeTrafegoEditar"

		session.setAttribute "flagExibirEditar", Constantes.TODAS_AS_DPGS_VALIDAS
		if (session.getAttribute("idMapaEstocagem") == null){
			session.setAttribute("idMapaEstocagem", params.id);
			System.out.println("id do mapa:" +params.id);
		}

		def listaDPGs;
		if (session.getAttribute("flagExibirEditar") == Constantes.TODAS_AS_DPGS) {
			listaDPGs = dpgService.consultarDPGs()
		}
		else {
			listaDPGs = dpgService.consultarDPGsValidas()
		}

		def mapaEstocagemInstance = new MapaEstocagem()
		return [listaDPGs: listaDPGs, mapaEstocagemInstance: mapaEstocagemInstance]
	}

	def criarDPGInvEditar = {
		session.setAttribute "flagExibirEditar", Constantes.TODAS_AS_DPGS
		def listaDPGs  = dpgService.consultarDPGs()
		def mapaEstocagemInstance = new MapaEstocagem()
		render(view:"criarDPGdoMapaEditar", model: [mapaEstocagemInstance: mapaEstocagemInstance, listaDPGs: listaDPGs])
	}

	def salvarDPGdoMapaEditar = {
		def idParam = params.idDPG;

		// nao foi selecionado nenhum ID, exibir mensagem de erro nullable para DPG do ME
		if (idParam == null){
			def mapaEstocagemInstance = new MapaEstocagem()
			mapaEstocagemInstance.errors.reject 'Por favor selecione uma DPG'

			def listaDPGs;
			if (session.getAttribute("flagExibirEditar") == Constantes.TODAS_AS_DPGS){
				listaDPGs = dpgService.consultarDPGs()
			}
			else {
				listaDPGs = dpgService.consultarDPGsValidas()
			}
			render(view:"criarDPGdoMapaEditar", model: [mapaEstocagemInstance: mapaEstocagemInstance,
						listaDPGs: listaDPGs])
			return
		} else {
			def idSelecionado = new Integer(idParam);
			session.setAttribute("idDPGEditar", idSelecionado);
			redirect(action: "criarMapaEstocagemEditar")
			return
		}
	}

	def criarMapaEstocagemEditar = {
		def idMapa = session.getAttribute("idMapaEstocagem");
		def mapaEstocagemInstance = MapaEstocagem.get(idMapa);

		Integer idDPG = (Integer) session.getAttribute("idDPGEditar");
		def dpgInstance = DPG.get(idDPG)
		return [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance: dpgInstance]
	}

	def voltarParaSelecionarDPGEditar = {
		redirect(action:"criarDPGdoMapaEditar")
		return
	}

	def salvarMapaEstocagemEditar = {
		def idMapa = session.getAttribute("idMapaEstocagem");

		def mapaEstocagemInstance = MapaEstocagem.get(idMapa);
		mapaEstocagemInstance.properties = params

		Integer idDPG = (Integer) session.getAttribute("idDPGEditar");
		def dpgInstance  = DPG.get(idDPG)

		mapaEstocagemInstance.dpg = dpgInstance

		System.out.println();
		System.out.println("id do mapa:" +idMapa);
		System.out.println(mapaEstocagemInstance);
		System.out.println(dpgInstance);
		System.out.println();

		mapaEstocagemInstance.dpg = dpgInstance

		if(!mapaEstocagemInstance.validate()){
			render(view:"criarMapaEstocagemEditar", model: [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance: dpgInstance])
			return
		} else {
			session.setAttribute "mapaEstocagemEditar", mapaEstocagemInstance
			redirect(action:"adicionarGuiasEditar")
			return
		}
	}

	def voltarParaCriarMapaEditar = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagemEditar");
		def dpgInstance  = DPG.get(mapaEstocagemInstance.dpg.id)
		session.removeAttribute "listaGuiasDeTrafegoEditar"
		render(view:"criarMapaEstocagemEditar", model: [mapaEstocagemInstance: mapaEstocagemInstance, dpgInstance: dpgInstance])
		return
	}

	def adicionarGuiasEditar = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagemEditar");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)

		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");
		if(listaGuiasDeTrafego == null){
			listaGuiasDeTrafego = new ArrayList<GuiaDeTrafego>();
		}
		session.setAttribute "listaGuiasDeTrafegoEditar", listaGuiasDeTrafego

		def idMapa = session.getAttribute("idMapaEstocagem");

		def listaGuiasDeTrafegoExistentes = GuiaDeTrafego.findAllByMapaDeEstocagem(MapaEstocagem.get(idMapa));

		guiaDeTrafegoService.addGuias (listaGuiasDeTrafego, listaGuiasDeTrafegoExistentes)

		return [mapaEstocagemInstance: mapaEstocagemInstance,
			dpgInstance: dpgInstance,
			listaGuiasDeTrafego:listaGuiasDeTrafego]
	}

	def adicionarNovaGuiaEditar = {
		def guiaDeTrafegoInstance = new GuiaDeTrafego()
		guiaDeTrafegoInstance.properties = params
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance]
	}

	def editarNovaGuiaEditar = {
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");
		def guiaDeTrafegoInstance = listaGuiasDeTrafego.get(Integer.parseInt(params.id));
		return [guiaDeTrafegoInstance: guiaDeTrafegoInstance, indexGuia: params.id]
	}


	def validarGuiaEditar = {


		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagemEditar");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)


		System.out.println();
		System.out.println(mapaEstocagemInstance);
		System.out.println();
		System.out.println(dpgInstance);
		System.out.println();

		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");
		def guiaDeTrafegoInstance = new GuiaDeTrafego(params)
		guiaDeTrafegoInstance.mapaDeEstocagem = mapaEstocagemInstance;

		// evita que parametros incorretos quebrem a validacao
		if (!guiaDeTrafegoInstance.validate()){
			System.out.println("VALIDACOES");
			return [resposta: Constantes.GUIA_RESPOSTA_SUCESSO]
		}
		if(!guiaDeTrafegoService.validarMateriaisDaGuia2(guiaDeTrafegoInstance, listaGuiasDeTrafego, dpgInstance)){
			System.out.println("ERRO");
			return [resposta: Constantes.GUIA_RESPOSTA_ERRO]
		}
		System.out.println("OK");
		return [resposta: Constantes.GUIA_RESPOSTA_SUCESSO]
	}



	def salvarNovaGuiaEditar = {
		def guiaDeTrafegoInstance = new GuiaDeTrafego()
		guiaDeTrafegoInstance.properties = params
		guiaDeTrafegoInstance.mapaDeEstocagem = new MapaEstocagem()

		if(!guiaDeTrafegoInstance.validate()){
			render(view:"adicionarNovaGuiaEditar", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance])
			return
		} else {
			List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");
			if (listaGuiasDeTrafego == null) {
				listaGuiasDeTrafego = new ArrayList<GuiaDeTrafego>();
			}
			// valida se existe alguma guia com mesmo numero
			for(GuiaDeTrafego guiaAtual: listaGuiasDeTrafego){
				if(guiaAtual.numeroDaGuia.equals(guiaDeTrafegoInstance.numeroDaGuia)){
					guiaDeTrafegoInstance.errors.reject "Numero da guia deve ja existente"
					render(view:"adicionarNovaGuiaEditar", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance])
					return
				}
			}

			listaGuiasDeTrafego.add(guiaDeTrafegoInstance);
			session.setAttribute "listaGuiasDeTrafego", listaGuiasDeTrafego
			flash.message = flash.message = "${message(code: 'desmontec.documentos.guiadetrafego.default.created.message')}"
			redirect(action:"adicionarGuiasEditar")
			return
		}
	}


	def salvarEditarNovaGuiaEditar = {
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");

		System.out.println();
		System.out.println(params.indexGuia);
		System.out.println();

		def guiaDeTrafegoInstance = listaGuiasDeTrafego.get(Integer.parseInt(params.indexGuia));
		guiaDeTrafegoInstance.properties = params
		guiaDeTrafegoInstance.mapaDeEstocagem = new MapaEstocagem()

		def GuiaDeTrafego guiaSalvar;
		if (guiaDeTrafegoInstance.id != null){
			try {
				guiaSalvar = GuiaDeTrafego.get(guiaDeTrafegoInstance.id);
				guiaSalvar.properties = params
				guiaDeTrafegoInstance = guiaSalvar;
			}
			catch (org.springframework.dao.DataIntegrityViolationException e) {
				redirect(action:"adicionarGuiasEditar")
				return
			}
		}

		if(!guiaDeTrafegoInstance.validate()){
			System.out.println();
			System.out.println("NAO PASSOU");
			System.out.println(guiaDeTrafegoInstance);
			System.out.println();
			render(view:"editarNovaGuiaEditar", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance, indexGuia: params.id])
			return
		} else {
			if (listaGuiasDeTrafego == null) {
				listaGuiasDeTrafego = new ArrayList<GuiaDeTrafego>();
			}
			// valida se existe alguma guia com mesmo numero
			int i = 0;
			for(GuiaDeTrafego guiaAtual: listaGuiasDeTrafego){
				if(guiaAtual.numeroDaGuia.equals(guiaDeTrafegoInstance.numeroDaGuia) && (i != Integer.parseInt(params.indexGuia))){
					guiaDeTrafegoInstance.errors.reject "Numero da guia deve ja existente"
					render(view:"editarNovaGuiaEditar", model:[guiaDeTrafegoInstance: guiaDeTrafegoInstance])
					return
				}
				i ++;
			}

			listaGuiasDeTrafego.remove(Integer.parseInt(params.indexGuia));
			// caso a guia esteja persistida em base ja atualiza ela
			if (guiaDeTrafegoInstance.id != null){
				try {
					guiaSalvar.save(flush:true)
				}
				catch (org.springframework.dao.DataIntegrityViolationException e) {
					flash.message = flash.message = "Nao foi possivel atualizar a guia com sucesso"
					redirect(action:"adicionarGuiasEditar")
					return
				}
			}
			listaGuiasDeTrafego.add(Integer.parseInt(params.indexGuia), guiaDeTrafegoInstance);
			session.setAttribute "listaGuiasDeTrafegoEditar", listaGuiasDeTrafego



			flash.message = flash.message = "${message(code: 'desmontec.documentos.guiadetrafego.default.updated.message')}"
			redirect(action:"adicionarGuiasEditar")
			return
		}
	}

	def excluirGuiaEditar = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagemEditar");
		def dpgInstance = DPG.get(mapaEstocagemInstance.dpg.id)
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");

		GuiaDeTrafego guiaRemover = listaGuiasDeTrafego.get(Integer.parseInt(params.id));
		if(guiaRemover.id != null){
			try{
				GuiaDeTrafego guiaRemover2 = GuiaDeTrafego.get(guiaRemover.id);
				guiaRemover2.delete(flush:true)
			}
			catch (org.springframework.dao.DataIntegrityViolationException e) {
				flash.message = flash.message = "Nao foi possivel excluir a guia"
				redirect(action:"adicionarGuiasEditar")
				return
			}
		}

		listaGuiasDeTrafego.remove(Integer.parseInt(params.id));
		session.setAttribute "listaGuiasDeTrafego", listaGuiasDeTrafego

		flash.message = flash.message = "${message(code: 'desmontec.documentos.guiadetrafego.default.deleted.message')}"

		render(view:"adicionarGuiasEditar", model:[mapaEstocagemInstance: mapaEstocagemInstance,
					dpgInstance: dpgInstance, listaGuiasDeTrafego:listaGuiasDeTrafego])
		return
	}



	def concluirMapaEstocagemEditar = {
		def mapaEstocagemInstance = (MapaEstocagem) session.getAttribute("mapaEstocagemEditar");
		List<GuiaDeTrafego> listaGuiasDeTrafego = (List<GuiaDeTrafego>) session.getAttribute("listaGuiasDeTrafegoEditar");

		try{
			MapaEstocagem mapaEstocagemSalvar = MapaEstocagem.get(mapaEstocagemInstance.id)
			if (mapaEstocagemSalvar.save(flush: true)) {
				for(GuiaDeTrafego guiaAtual: listaGuiasDeTrafego){
					guiaAtual.mapaDeEstocagem = mapaEstocagemSalvar;

					if(guiaAtual.id != null){
						GuiaDeTrafego guiaSalvar = GuiaDeTrafego.get(guiaAtual.id);
						guiaSalvar.copiarGuia(guiaAtual);
						guiaSalvar.save(flush: true);
					} else {
						guiaAtual.save(flush: true);
					}
				}
				//depois de adicionar as guias, verificamaos a validade da dpg
				def resposta = 0
				resposta = dpgService.atualizaValidadeDPG(mapaEstocagemSalvar.dpg)
				StringBuffer mensagem = new StringBuffer();

				if (resposta == Constantes.DPG_INVALIDADA){
					mensagem.append ("DPG numero ");
					mensagem.append(mapaEstocagemSalvar.dpg.numero);
					mensagem.append(" invalidada.");
					mensagem.append(Constantes.LINHA);
					mensagem.append("${message(code: 'desmontec.documentos.MapaEstocagem.default.updated.message')}");

					flash.message = mensagem.toString();
				} else {
					flash.message = "${message(code: 'desmontec.documentos.MapaEstocagem.default.updated.message')}"
				}

				System.out.println("resposta ==> " +resposta);

				session.removeAttribute "mapaEstocagemEditar"
				session.removeAttribute "idDPGEditar"
				session.removeAttribute "listaGuiasDeTrafegoEditar"
				session.removeAttribute "flagExibirEditar"

				redirect (action:"exibirMapaEstocagem", id: mapaEstocagemSalvar.id)
				return
			}
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			flash.message = flash.message = "Nao foi possivel atualizar o Mapa de Estocagem e suas Guias de Trafego"
			redirect(action:"adicionarGuiasEditar")
			return
		}
		return
	}

	// FLUXO PARA EDITAR UM MAPA DE ESTOCAGEM - FIM
	
	def exibirResponsavel = {
		def idResponsavel = params.id
		def engenheiro = Engenheiro.get(idResponsavel)
		return [ResponsavelInstance: engenheiro]
	}
	
	def exibirQuantidadeMaximaMateriais = { 
		def idDpg = params.id
		def dpg = DPG.get(idDpg)
		return [DPGInstance: dpg]
	}
}



